package Model;

import java.util.ArrayList;
import java.util.ListIterator;

/**
 * Classe permettant de gérer le damier
 * @author El Meknassi Hamza (10806466) - Migeon Cyril (11007322)
 */
public class Damier {
    private Case plateau[][] = new Case [10][10];
    private ArrayList<Piece> piecesJouables  = new ArrayList<Piece>();

    /**
     * Constructeur de Damier
     */
    public Damier (){
        for (int y=0; y<10; y++)
        {
            for (int x=0; x<10;x++)
            {
                if ((x+y) %2 == 1)
                    plateau[x][y] = new Case(0, x, y);
                else
                    plateau[x][y] = new Case(x, y);
            }
        }
        placerPieces();
    }

    /**
     *  Appelée par  Damier, place les pions pour demarrer une partie
     */
    private void placerPieces(){
        for(int y=0; y<10; y++)
        {
            for(int x=0; x<10; x++)
            {
                if(((x+y)%2==1) && y<4)
                {
                    this.plateau[x][y].setPiece(new Pion('n', x, y, this));
                    this.plateau[x][y].setEtat(1);
                }
                else if(((x+y)%2==1) && y>5)
                {
                    this.plateau[x][y].setPiece(new Pion('b', x, y, this));
                    this.plateau[x][y].setEtat(1);
                }
            }
        }
    }
    
    /**
     * Parcours le damier pour voir les pions qui peuvent manger une pièce
     * @param joueur
     */
    public void setPiecesJouables(Joueur joueur){
        this.piecesJouables.clear();
        for(int y=0; y<10; y++)
        {
            for(int x=0; x<10; x++)
            {
                if (this.getCase(x, y).getEtat() == 1)
                {
                    if(this.getCase(x, y).getPiece().getCouleur() == joueur.getCouleur())
                    {
                        Piece piece = this.getCase(x, y).getPiece();
                        if(piece.peutManger(joueur))
                        {
                            this.getCase(x, y).setCaseProposee(true);
                            this.piecesJouables.add(piece);
                        }
                    }
                }
            }
        }
        if (!piecesJouables.isEmpty())
            System.out.println("Vous pouvez effectuer "+piecesJouables.size()+" prise(s)");
    }

    /**
     * Set les pièces jouables dans l'ArrayList piecesJouables
     * @param caseCible
     * @param joueur 
     */
    public void setPiecesJouables(Case caseCible, Joueur joueur){
        this.piecesJouables.clear();
        
        if(caseCible.getPiece().peutManger(joueur))
        {
            caseCible.setCaseProposee(true);
            this.piecesJouables.add(caseCible.getPiece());
        }
        if (!piecesJouables.isEmpty())
            System.out.println("Vous pouvez effectuer "+piecesJouables.size()+" prise(s)");
    }

    /**
     * Get des pièces jouables 
     * @return piecesJouables
     */
    public ArrayList getPiecesJouables(){return this.piecesJouables;}

    /**
     * Get de la case avec les coordonnées en paramètres
     * @param x
     * @param y
     * @return plateau[x][y]
     */
    public Case getCase(int x, int y){return this.plateau[x][y];}


    /**
     * POUR DEBUG : Affichage texte
     */
    public void afficher(){

        for (int y=0; y<10; y++)
        {
            for (int x=0; x<10;x++)
                System.out.print("["+plateau[x][y].getEtat()+"]");

            System.out.println();
        }
    }

    /**
     * Permet de décolorier les cases avec un pion pouvant en "manger" un autre du plateau
     */
    public void viderCasesProposees()
    {
        ListIterator<Piece> itr = piecesJouables.listIterator();
        while(itr.hasNext())
        {
            Piece piece = itr.next();
            this.getCase(piece.getPosition().getX(),piece.getPosition().getY()).setCaseProposee(false);
        }
    }

    /*
     * Créer une Dame avec la position donnée en paramètre et la couleur
     * @param position
     * @param couleur
     */
    void creerDame(Position position, char couleur) {
        int x = position.getX();
        int y = position.getY();
        this.getCase(x, y).setPiece(new Dame(couleur,x,y,this));
    }

}
